package com.sddr.config.operation;

import com.sddr.base.frame.metadata.MetaDataOperation;
import com.sddr.config.observe.ConfigNotify;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;

/**
 * @author 山顶洞人郑某
 * @className AbstractRemoteConfigRuleOperation.java 模板方法模式 支持Nacos配置中心 Aopllo配置中心
 * @date 2025 07 13
 */
@AllArgsConstructor
public abstract class AbstractRemoteConfigRuleOperation implements RemoteConfigRuleOperation  {
    /**
     * 元数据操作接口
     */
    private final MetaDataOperation metaDataOperation;

    /**
     * 配置变更通知类
     */
    private final ConfigNotify configNotify;

    /**
     * 获取配置信息
     * @param generalConfig 配置标识 （全局读取还是读取自己服务的配置）
     * @return
     * @throws Exception
     */
    @Override
    public String getConfig(final boolean generalConfig) throws Exception {
        //从配置中心获取 Group 和 DataId
        String group = getGroup();
        String dataId = getDataId(generalConfig);
        return getDefiniteConfig(group, dataId);
    }

    /**
     * 获取配置信息
     * @param group 组
     * @param dataId 数据Id
     * @return  配置信息
     */
    public abstract String getDefiniteConfig(String group, String dataId) throws Exception;

    /**
     * 获取DataId Nacos和Aopllo中每个服务实例都有一个对应的DataId
     * @return
     */
    public String getDataId(boolean generalConfig) {
        //如果是true 就是监听全局的配置信息 那么规定了 group和dataId是一致的
        return generalConfig ? getGroup() : metaDataOperation.getServiceId();
    }


    public String getGroup() {
        //从配置中心的元数据中获取分组
        return metaDataOperation.getGroup();
    }

    public void callbackConfig(String config) {
        if (StringUtils.isNotBlank(config)) {
            configNotify.doNotify(config);
        }
    }
}
